package com.hfb.mashibing.alip8.designpattern._013Iterator;

import java.util.Objects;

/**
 * Q: 构架一个容器，可以添加对象
 * A: 数组实现 V1
 * A: 链表实现 V2
 * A: 数组、链表实现接口 V3
 *
 */
public class V3Main {

    public static void main(String[] args) {
        Collection li = new LinkedList();
        for (int i = 0; i < 15; i++) {
            li.add(new String("s" + i));
        }
        System.err.printf("LinkedList 的长度：%s\n", li.size());

        li = new ArrayList();
        for (int i = 0; i < 15; i++) {
            li.add(new String("s" + i));
        }
        System.err.printf("ArrayList 的长度：%s\n", li.size());
    }

    interface Collection {
        void add(Object o);
        int size();
    }
    /**
     * 相比数组，此容器不用考虑边界问题，可以动态扩展
     */
    static class ArrayList implements Collection {
        Object[] objects = new Object[10];
        /*
         *   objects 中下一个空位置在哪儿，or 目前容器中有多少个元素
         */
        private int index = 0;   // 冗余数据

        @Override
        public void add(Object o) {
            if (index == objects.length) {
                Objects[] newObjects = new Objects[objects.length*2];
                System.arraycopy(objects, 0, newObjects, 0, objects.length);
                objects = newObjects;
            }
            objects[index] = o;
            index ++;
        }
        @Override
        public int size(){
            return index;
        }
    }

    /**
     * 相比数组，此容器不用考虑边界问题，可以动态扩展
     */
    static class LinkedList implements Collection {
        Node head = null;
        Node tail = null;   // 冗余数据
        /*
         *   objects 中下一个空位置在哪儿，or 目前容器中有多少个元素
         */
        private int size = 0;   // 冗余数据
        @Override
        public void add(Object o) {
            Node n = new Node(o);
            n.next = null;
            if(Objects.isNull(head)){
                head = n;
                tail = n;
            }
            tail.next = n;
            tail = n;
            size ++;
        }
        @Override
        public int size(){
            return size;
        }

        class Node{
            private Object o; // 存放数据
            Node next;  // 指向宪哥节点的指针

            public Node(Object o) {
                this.o = o;
            }
        }
    }
}
